Prometheus 替代方案:VictoriaMetrics

136次阅读
没有评论

共计 8280 个字符,预计需要花费 21 分钟才能阅读完成。

背景

这里不在啰嗦赘述prometheu、thanos、victoriametrics 等组件的异同优劣,网上文章都快讲烂掉。
参考链接:https://cloud.tencent.com/developer/article/2145684

使用 vm 有几点重要原因:

  • 配置简单,无缝兼容 prometheu 。无论是存储数据的导入, 抓取配置,还是查询接口。
  • 降低 使用 prometheu 的内存和磁盘负载。
  • 解决 数据长期存储问题。
  • 解决 prometheu 原生不支持集群的问题。
    • 当 prometheus 数据量过大时,高负载往往会令人头痛。
    • 选择单机纵向扩展吧,单节点往往会扛不住超大数据样本的查询,而且当故障恢复时,从wal中加载数据到内存需要超长时间。
    • 横向拓展又没有原生的集群实现,只能依赖联邦或者thanos等其他方式。

Prometheus 替代方案:VictoriaMetrics

官方介绍的很美好,本文我在个人环境使用单机版部署,实践下来结果基本符合。 12G / 1.6G = 7.5。对磁盘的压力少了7.5倍。

# du -sh /var/lib/prometheus/
12G /var/lib/prometheus/

# du -sh /var/lib/victoria-metrics/
1.6G    /var/lib/victoria-metrics/

后续计划于线上环境进行改造。

实践

vm部署

参考链接:https://docs.victoriametrics.com/quick-start/#starting-vm-single-from-a-binary

操作系统:Ubuntu20.04

部署方式:单机版二进制部署

官网已经有全量的playbook,但是太重,我编写了一个简单的ansible playbook:

16:08:39 # tree
.
├── hosts
├── roles
│   └── VictoriaMetrics
│       ├── files
│       │   ├── victoria-metrics-linux-amd64-v1.103.0.tar.gz
│       │   ├── victoria-metrics-prod
│       │   ├── victoriametrics.service
│       │   ├── vmagent-prod
│       │   ├── vmalert-prod
│       │   ├── vmalert-tool-prod
│       │   ├── vmauth-prod
│       │   ├── vmbackup-prod
│       │   ├── vmctl-prod
│       │   ├── vmrestore-prod
│       │   └── vmutils-linux-amd64-v1.103.0.tar.gz
│       └── tasks
│           └── main.yml
└── VictoriaMetrics.yml

4 directories, 14 files

[root@ centos-ops /ansible/monitor]
16:08:58 # cat VictoriaMetrics.yml 
- hosts: Install_VictoriaMetrics
  roles:
    - VictoriaMetrics

[root@ centos-ops /ansible/monitor]
16:09:03 # cat roles/VictoriaMetrics/tasks/main.yml 
- name: 获取 VictoriaMetrics 最新发布版本信息
  delegate_to: 127.0.0.1
  uri:
    url: https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest
    return_content: yes
    validate_certs: no
  register: latest_release

#- name: 调试输出 latest_release 的内容
#  delegate_to: 127.0.0.1
#  debug:
#    var: latest_release.json

- name: 提取符合条件的下载地址列表
  delegate_to: 127.0.0.1
  set_fact:
    filtered_assets: "{{ latest_release.json.assets | selectattr('name', 'search', '^victoria-metrics-linux-amd64-v[0-9.]+\\.tar\\.gz$') | map(attribute='browser_download_url') }}"

- name: 调试输出 filtered_assets 变量
  delegate_to: 127.0.0.1
  debug:
    var: filtered_assets

- name: 设置下载地址
  delegate_to: 127.0.0.1
  set_fact:
    package_url: "{{ filtered_assets | first }}"
  when: filtered_assets | length > 0

- name: 检查下载地址是否已设置
  fail:
    msg: "未找到符合条件的下载地址。"
  when: package_url is not defined

- name: 调试输出 package_url 变量
  delegate_to: 127.0.0.1
  debug:
    var: package_url

- name: 创建目录
  delegate_to: 127.0.0.1
  file:
    path: "{{ role_path }}/files"
    state: directory

- name: 下载 VictoriaMetrics 最新发布版本安装包
  delegate_to: 127.0.0.1
  get_url:
    url: "{{ package_url }}"
    dest: "{{ role_path }}/files/{{ package_url | basename }}"

- name: 解压 VictoriaMetrics 安装包
  delegate_to: 127.0.0.1
  unarchive:
    src: "{{ role_path }}/files/{{ package_url | basename }}"
    dest: "{{ role_path }}/files/"
    remote_src: yes

- name: 将 victoria-metrics-prod(单机版) 下发到远端
  copy:
    src: "{{ role_path }}/files/victoria-metrics-prod"
    dest: /usr/local/bin/victoria-metrics-prod
    mode: '0755'
  delegate_to: "{{ inventory_hostname }}"

- name: 创建 victoriametrics 用户
  user:
    name: victoriametrics
    shell: /usr/sbin/nologin
    system: yes

- name: 创建用于存储 VictoriaMetrics 数据的文件夹
  file:
    path: /var/lib/victoria-metrics
    state: directory
    owner: victoriametrics
    group: victoriametrics
    mode: '0755'

- name: 下发 systemd 单元文件
  copy:
    src: "{{ role_path }}/files/victoriametrics.service"
    dest: /etc/systemd/system/victoriametrics.service
    mode: '0644'

- name: 刷新 systemd 配置
  command: systemctl daemon-reload

- name: 启用 victoriametrics 服务并设置开机自启
  systemd:
    name: victoriametrics
    enabled: yes
    state: started

- name: 检查 victoriametrics 服务运行状态
  command: systemctl status victoriametrics.service
  register: service_status
  ignore_errors: yes

- name: 调试输出服务状态
  debug:
    var: service_status.stdout_lines

抓取配置。这个文件是直接拷贝了原始 prometheus.yml,删除了prometheu自身的监控job。

# cat /etc/victoria-metrics/prometheus.yml 
global:
  evaluation_interval: 15s
  scrape_interval: 30s
  scrape_timeout: 10s

rule_files:
   - "/etc/victoria-metrics/rules/*rules.yml"

scrape_configs:
- job_name: victoria-metrics-prod
  static_configs:
  - targets:
    - localhost:8428

- job_name: "node_exporter"
  file_sd_configs:
    - files:
      - "/etc/victoria-metrics/file_sd/node.yml"

- job_name: 'blackbox_http'
  scrape_interval: 60s
  metrics_path: /probe
  params:
    module: [http_2xx]
  file_sd_configs:
    - files:
      - '/etc/victoria-metrics/file_sd/blackbox_http.yml'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 127.0.0.1:9119

- job_name: 'blackbox_ping'
  scrape_interval: 60s
  metrics_path: /probe
  params:
    module: [icmp]
  file_sd_configs:
    - files:
        - '/etc/victoria-metrics/file_sd/blackbox_ping.yml'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 127.0.0.1:9119

- job_name: 'blackbox_tcp'
  scrape_interval: 30s
  metrics_path: /probe
  params:
    module: [tcp_connect]
  file_sd_configs:
    - files:
      - '/etc/victoria-metrics/file_sd/blackbox_tcp.yml'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 127.0.0.1:9119

- job_name: 'blackbox_tls'
  scrape_interval: 30s
  metrics_path: /probe
  params:
    module: [http_2xx]
  file_sd_configs:
    - files:
      - '/etc/victoria-metrics/file_sd/blackbox_tls.yml'
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 127.0.0.1:9119

部署:

ansible-playbook -i hosts VictoriaMetrics.yml

数据写入配置

vm 和 prometheu 类似,同时支持 push​ 和 pull​两种模型。重点介绍pull。

作为 prometheu 远程存储

参考链接:docs.victoriametrics.com/#prometheus-setup

如果仅希望使用 vm 作为 prometheu 的长期存储,降低 prometheu 的存储和读取压力。可以选择使用 prometheu 远程存储,将数据持久化写入到 vm 中。

prometheu配置:

# vim /etc/prometheus/prometheus.yml
remote_write:
  - url: http://127.0.0.1:8428/api/v1/write

直接抓取 exporter

参考链接:docs.victoriametrics.com/vmagent/?highlight=promscrapeconfigstri…

如果希望使用 vm 替代 prometheu,则需要像 prometheu 一样,直接从 exporter 中抓取数据。

vm 兼容 prometheus.yml 配置文件,但是 prometheus.yml 中可能存在不兼容的配置。需要配置启动命令过滤一些不受支持的 job。

相关的启动参数:promscrape.config​、promscrape.config.strictParse

16:19:58 # cat /etc/systemd/system/victoriametrics.service 
[Unit]
Description=VictoriaMetrics service
After=network.target

[Service]
Type=simple
User=victoriametrics
Group=victoriametrics
ExecStart=/usr/local/bin/victoria-metrics-prod \
-storageDataPath=/var/lib/victoria-metrics \
-retentionPeriod=90d \
-selfScrapeInterval=10s \
-promscrape.config=/etc/victoria-metrics/prometheus.yml \
-promscrape.config.strictParse=false 

SyslogIdentifier=victoriametrics
Restart=always

PrivateTmp=yes
ProtectHome=yes
NoNewPrivileges=yes

ProtectSystem=full

[Install]
WantedBy=multi-user.target

导入 prometheu 数据

参考链接:docs.victoriametrics.com/vmctl/?highlight=vmbatchsize%3D200000#i…

无论采取 作为 prometheu 远程存储​ 或 直接抓取 exporter​作为拉取方式,后续的监控数据查询都需要直接访问 vm 。

所以需要将 prometheu 的历史数据导入到 vm 中。

# 生成prometheus 数据快照,需要在prometheu执行命令添加参数 --web.enable-admin-api
# 生成的快照为 prometheu data 硬链接,并不会直接占用大量磁盘,往往几秒钟即可生成快照
curl -XPOST 127.0.0.1:9090/api/v1/admin/tsdb/snapshot

# 由于数据样本过多,导入之前请确认文件描述符是否够用。否则会出现 too many open files 报错
# 这里使用命令临时扩大了限制
ulimit -n 65536

# 使用 vmctl-prod 导入数据
12:22:30 # /ansible/monitor/roles/VictoriaMetrics/files/vmctl-prod prometheus --prom-snapshot=/var/lib/prometheus/snapshots/20240929T040741Z-37c2ae8c99894d97 --vm-concurrency=1 --vm-batch-size=200000 --prom-concurrency=3
Prometheus import mode
Prometheus snapshot stats:
  blocks found: 2162;
  blocks skipped by time filter: 0;
  min time: 1719799202256 (2024-07-01T10:00:02+08:00);
  max time: 1727582860693 (2024-09-29T12:07:40+08:00);
  samples: 6039512403;
  series: 51533350.
Found 2162 blocks to import. Continue? [Y/n] y
VM worker 0:↓ 1969775 samples/s                                                                                                                                                                               
Processing blocks: 2161 / 2162 [██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████] 99.95%
2024/09/29 13:11:05 Import finished!
2024/09/29 13:11:05 VictoriaMetrics importer stats:
  idle duration: 6m51.959900277s;
  time spent while importing: 48m25.622479983s;
  total samples: 6039512403;
  samples/s: 2078560.60;
  total bytes: 122.1 GB;
  bytes/s: 42.0 MB;
VM worker 0:↙ 1969775 samples/s                                                                                                                                                                               
Processing blocks: 2162 / 2162 [█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████] 100.00%
2024/09/29 13:11:05 Total time: 48m30.11928336s

12GB数据,官方推荐参数,在 nvme ssd下导入花费47分钟。大约 4MB/S。

# du -sh /var/lib/prometheus/
12G /var/lib/prometheus/

# du -sh /var/lib/victoria-metrics/
1.6G    /var/lib/victoria-metrics/

导入完毕后压缩为1.6G,降低7.5倍的存储量。

Grafana 配置

由于个人环境中的 panel 都绑定了旧 prometheu 数据源,修改上百个panel不是一件好方式。

直接将数据源修改为 vm 的 ip:port 就好。

Prometheus 替代方案:VictoriaMetrics

查看面板,可以发现无缝兼容。
Prometheus 替代方案:VictoriaMetrics

参考链接:grafana.com/grafana/dashboards/10229-victoriametrics-single-node…

官方提供了针对 vm 自身的监控,酌情添加:
Prometheus 替代方案:VictoriaMetrics

总结

vm 可以极大降低使用 prometheu 的硬件成本,同时迁移到 vm 路线也仅需要付出极少的人工成本。

生产环境更换后的使用案例后续再更新。

本文属于专题:Prometheus 监控

引用链接

正文完
 
pengyinwei
版权声明:本站原创文章,由 pengyinwei 2024-09-29发表,共计8280字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.opshub.cn
评论(没有评论)